/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import mundo.Inventario;
import mundo.Garantia;
import mundo.CategoriaProducto;
import mundo.ProductoProveedor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import mundo.DetalleVenta;
import mundo.CostoHistorico;
import mundo.Producto;
import mundo.PromocioProducto;

/**
 *
 * @author USUARIO WINDOWS
 */
public class ProductoJpaController implements Serializable {

    public ProductoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Producto producto) throws PreexistingEntityException, Exception {
        if (producto.getProductoProveedorCollection() == null) {
            producto.setProductoProveedorCollection(new ArrayList<ProductoProveedor>());
        }
        if (producto.getDetalleVentaCollection() == null) {
            producto.setDetalleVentaCollection(new ArrayList<DetalleVenta>());
        }
        if (producto.getCostoHistoricoCollection() == null) {
            producto.setCostoHistoricoCollection(new ArrayList<CostoHistorico>());
        }
        if (producto.getPromocioProductoCollection() == null) {
            producto.setPromocioProductoCollection(new ArrayList<PromocioProducto>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Inventario inventario = producto.getInventario();
            if (inventario != null) {
                inventario = em.getReference(inventario.getClass(), inventario.getIdProducto());
                producto.setInventario(inventario);
            }
            Garantia garantiaidGarantia = producto.getGarantiaidGarantia();
            if (garantiaidGarantia != null) {
                garantiaidGarantia = em.getReference(garantiaidGarantia.getClass(), garantiaidGarantia.getIdGarantia());
                producto.setGarantiaidGarantia(garantiaidGarantia);
            }
            CategoriaProducto idCategoria = producto.getIdCategoria();
            if (idCategoria != null) {
                idCategoria = em.getReference(idCategoria.getClass(), idCategoria.getIdCategoria());
                producto.setIdCategoria(idCategoria);
            }
            Collection<ProductoProveedor> attachedProductoProveedorCollection = new ArrayList<ProductoProveedor>();
            for (ProductoProveedor productoProveedorCollectionProductoProveedorToAttach : producto.getProductoProveedorCollection()) {
                productoProveedorCollectionProductoProveedorToAttach = em.getReference(productoProveedorCollectionProductoProveedorToAttach.getClass(), productoProveedorCollectionProductoProveedorToAttach.getProductoProveedorPK());
                attachedProductoProveedorCollection.add(productoProveedorCollectionProductoProveedorToAttach);
            }
            producto.setProductoProveedorCollection(attachedProductoProveedorCollection);
            Collection<DetalleVenta> attachedDetalleVentaCollection = new ArrayList<DetalleVenta>();
            for (DetalleVenta detalleVentaCollectionDetalleVentaToAttach : producto.getDetalleVentaCollection()) {
                detalleVentaCollectionDetalleVentaToAttach = em.getReference(detalleVentaCollectionDetalleVentaToAttach.getClass(), detalleVentaCollectionDetalleVentaToAttach.getDetalleVentaPK());
                attachedDetalleVentaCollection.add(detalleVentaCollectionDetalleVentaToAttach);
            }
            producto.setDetalleVentaCollection(attachedDetalleVentaCollection);
            Collection<CostoHistorico> attachedCostoHistoricoCollection = new ArrayList<CostoHistorico>();
            for (CostoHistorico costoHistoricoCollectionCostoHistoricoToAttach : producto.getCostoHistoricoCollection()) {
                costoHistoricoCollectionCostoHistoricoToAttach = em.getReference(costoHistoricoCollectionCostoHistoricoToAttach.getClass(), costoHistoricoCollectionCostoHistoricoToAttach.getCostoHistoricoPK());
                attachedCostoHistoricoCollection.add(costoHistoricoCollectionCostoHistoricoToAttach);
            }
            producto.setCostoHistoricoCollection(attachedCostoHistoricoCollection);
            Collection<PromocioProducto> attachedPromocioProductoCollection = new ArrayList<PromocioProducto>();
            for (PromocioProducto promocioProductoCollectionPromocioProductoToAttach : producto.getPromocioProductoCollection()) {
                promocioProductoCollectionPromocioProductoToAttach = em.getReference(promocioProductoCollectionPromocioProductoToAttach.getClass(), promocioProductoCollectionPromocioProductoToAttach.getPromocioProductoPK());
                attachedPromocioProductoCollection.add(promocioProductoCollectionPromocioProductoToAttach);
            }
            producto.setPromocioProductoCollection(attachedPromocioProductoCollection);
            em.persist(producto);
            if (inventario != null) {
                Producto oldProductoOfInventario = inventario.getProducto();
                if (oldProductoOfInventario != null) {
                    oldProductoOfInventario.setInventario(null);
                    oldProductoOfInventario = em.merge(oldProductoOfInventario);
                }
                inventario.setProducto(producto);
                inventario = em.merge(inventario);
            }
            if (garantiaidGarantia != null) {
                garantiaidGarantia.getProductoCollection().add(producto);
                garantiaidGarantia = em.merge(garantiaidGarantia);
            }
            if (idCategoria != null) {
                idCategoria.getProductoCollection().add(producto);
                idCategoria = em.merge(idCategoria);
            }
            for (ProductoProveedor productoProveedorCollectionProductoProveedor : producto.getProductoProveedorCollection()) {
                Producto oldProductoOfProductoProveedorCollectionProductoProveedor = productoProveedorCollectionProductoProveedor.getProducto();
                productoProveedorCollectionProductoProveedor.setProducto(producto);
                productoProveedorCollectionProductoProveedor = em.merge(productoProveedorCollectionProductoProveedor);
                if (oldProductoOfProductoProveedorCollectionProductoProveedor != null) {
                    oldProductoOfProductoProveedorCollectionProductoProveedor.getProductoProveedorCollection().remove(productoProveedorCollectionProductoProveedor);
                    oldProductoOfProductoProveedorCollectionProductoProveedor = em.merge(oldProductoOfProductoProveedorCollectionProductoProveedor);
                }
            }
            for (DetalleVenta detalleVentaCollectionDetalleVenta : producto.getDetalleVentaCollection()) {
                Producto oldIdProductoOfDetalleVentaCollectionDetalleVenta = detalleVentaCollectionDetalleVenta.getIdProducto();
                detalleVentaCollectionDetalleVenta.setIdProducto(producto);
                detalleVentaCollectionDetalleVenta = em.merge(detalleVentaCollectionDetalleVenta);
                if (oldIdProductoOfDetalleVentaCollectionDetalleVenta != null) {
                    oldIdProductoOfDetalleVentaCollectionDetalleVenta.getDetalleVentaCollection().remove(detalleVentaCollectionDetalleVenta);
                    oldIdProductoOfDetalleVentaCollectionDetalleVenta = em.merge(oldIdProductoOfDetalleVentaCollectionDetalleVenta);
                }
            }
            for (CostoHistorico costoHistoricoCollectionCostoHistorico : producto.getCostoHistoricoCollection()) {
                Producto oldProductoOfCostoHistoricoCollectionCostoHistorico = costoHistoricoCollectionCostoHistorico.getProducto();
                costoHistoricoCollectionCostoHistorico.setProducto(producto);
                costoHistoricoCollectionCostoHistorico = em.merge(costoHistoricoCollectionCostoHistorico);
                if (oldProductoOfCostoHistoricoCollectionCostoHistorico != null) {
                    oldProductoOfCostoHistoricoCollectionCostoHistorico.getCostoHistoricoCollection().remove(costoHistoricoCollectionCostoHistorico);
                    oldProductoOfCostoHistoricoCollectionCostoHistorico = em.merge(oldProductoOfCostoHistoricoCollectionCostoHistorico);
                }
            }
            for (PromocioProducto promocioProductoCollectionPromocioProducto : producto.getPromocioProductoCollection()) {
                Producto oldProductoOfPromocioProductoCollectionPromocioProducto = promocioProductoCollectionPromocioProducto.getProducto();
                promocioProductoCollectionPromocioProducto.setProducto(producto);
                promocioProductoCollectionPromocioProducto = em.merge(promocioProductoCollectionPromocioProducto);
                if (oldProductoOfPromocioProductoCollectionPromocioProducto != null) {
                    oldProductoOfPromocioProductoCollectionPromocioProducto.getPromocioProductoCollection().remove(promocioProductoCollectionPromocioProducto);
                    oldProductoOfPromocioProductoCollectionPromocioProducto = em.merge(oldProductoOfPromocioProductoCollectionPromocioProducto);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findProducto(producto.getIdProducto()) != null) {
                throw new PreexistingEntityException("Producto " + producto + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Producto producto) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Producto persistentProducto = em.find(Producto.class, producto.getIdProducto());
            Inventario inventarioOld = persistentProducto.getInventario();
            Inventario inventarioNew = producto.getInventario();
            Garantia garantiaidGarantiaOld = persistentProducto.getGarantiaidGarantia();
            Garantia garantiaidGarantiaNew = producto.getGarantiaidGarantia();
            CategoriaProducto idCategoriaOld = persistentProducto.getIdCategoria();
            CategoriaProducto idCategoriaNew = producto.getIdCategoria();
            Collection<ProductoProveedor> productoProveedorCollectionOld = persistentProducto.getProductoProveedorCollection();
            Collection<ProductoProveedor> productoProveedorCollectionNew = producto.getProductoProveedorCollection();
            Collection<DetalleVenta> detalleVentaCollectionOld = persistentProducto.getDetalleVentaCollection();
            Collection<DetalleVenta> detalleVentaCollectionNew = producto.getDetalleVentaCollection();
            Collection<CostoHistorico> costoHistoricoCollectionOld = persistentProducto.getCostoHistoricoCollection();
            Collection<CostoHistorico> costoHistoricoCollectionNew = producto.getCostoHistoricoCollection();
            Collection<PromocioProducto> promocioProductoCollectionOld = persistentProducto.getPromocioProductoCollection();
            Collection<PromocioProducto> promocioProductoCollectionNew = producto.getPromocioProductoCollection();
            List<String> illegalOrphanMessages = null;
            if (inventarioOld != null && !inventarioOld.equals(inventarioNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Inventario " + inventarioOld + " since its producto field is not nullable.");
            }
            for (ProductoProveedor productoProveedorCollectionOldProductoProveedor : productoProveedorCollectionOld) {
                if (!productoProveedorCollectionNew.contains(productoProveedorCollectionOldProductoProveedor)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ProductoProveedor " + productoProveedorCollectionOldProductoProveedor + " since its producto field is not nullable.");
                }
            }
            for (DetalleVenta detalleVentaCollectionOldDetalleVenta : detalleVentaCollectionOld) {
                if (!detalleVentaCollectionNew.contains(detalleVentaCollectionOldDetalleVenta)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain DetalleVenta " + detalleVentaCollectionOldDetalleVenta + " since its idProducto field is not nullable.");
                }
            }
            for (CostoHistorico costoHistoricoCollectionOldCostoHistorico : costoHistoricoCollectionOld) {
                if (!costoHistoricoCollectionNew.contains(costoHistoricoCollectionOldCostoHistorico)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain CostoHistorico " + costoHistoricoCollectionOldCostoHistorico + " since its producto field is not nullable.");
                }
            }
            for (PromocioProducto promocioProductoCollectionOldPromocioProducto : promocioProductoCollectionOld) {
                if (!promocioProductoCollectionNew.contains(promocioProductoCollectionOldPromocioProducto)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain PromocioProducto " + promocioProductoCollectionOldPromocioProducto + " since its producto field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (inventarioNew != null) {
                inventarioNew = em.getReference(inventarioNew.getClass(), inventarioNew.getIdProducto());
                producto.setInventario(inventarioNew);
            }
            if (garantiaidGarantiaNew != null) {
                garantiaidGarantiaNew = em.getReference(garantiaidGarantiaNew.getClass(), garantiaidGarantiaNew.getIdGarantia());
                producto.setGarantiaidGarantia(garantiaidGarantiaNew);
            }
            if (idCategoriaNew != null) {
                idCategoriaNew = em.getReference(idCategoriaNew.getClass(), idCategoriaNew.getIdCategoria());
                producto.setIdCategoria(idCategoriaNew);
            }
            Collection<ProductoProveedor> attachedProductoProveedorCollectionNew = new ArrayList<ProductoProveedor>();
            for (ProductoProveedor productoProveedorCollectionNewProductoProveedorToAttach : productoProveedorCollectionNew) {
                productoProveedorCollectionNewProductoProveedorToAttach = em.getReference(productoProveedorCollectionNewProductoProveedorToAttach.getClass(), productoProveedorCollectionNewProductoProveedorToAttach.getProductoProveedorPK());
                attachedProductoProveedorCollectionNew.add(productoProveedorCollectionNewProductoProveedorToAttach);
            }
            productoProveedorCollectionNew = attachedProductoProveedorCollectionNew;
            producto.setProductoProveedorCollection(productoProveedorCollectionNew);
            Collection<DetalleVenta> attachedDetalleVentaCollectionNew = new ArrayList<DetalleVenta>();
            for (DetalleVenta detalleVentaCollectionNewDetalleVentaToAttach : detalleVentaCollectionNew) {
                detalleVentaCollectionNewDetalleVentaToAttach = em.getReference(detalleVentaCollectionNewDetalleVentaToAttach.getClass(), detalleVentaCollectionNewDetalleVentaToAttach.getDetalleVentaPK());
                attachedDetalleVentaCollectionNew.add(detalleVentaCollectionNewDetalleVentaToAttach);
            }
            detalleVentaCollectionNew = attachedDetalleVentaCollectionNew;
            producto.setDetalleVentaCollection(detalleVentaCollectionNew);
            Collection<CostoHistorico> attachedCostoHistoricoCollectionNew = new ArrayList<CostoHistorico>();
            for (CostoHistorico costoHistoricoCollectionNewCostoHistoricoToAttach : costoHistoricoCollectionNew) {
                costoHistoricoCollectionNewCostoHistoricoToAttach = em.getReference(costoHistoricoCollectionNewCostoHistoricoToAttach.getClass(), costoHistoricoCollectionNewCostoHistoricoToAttach.getCostoHistoricoPK());
                attachedCostoHistoricoCollectionNew.add(costoHistoricoCollectionNewCostoHistoricoToAttach);
            }
            costoHistoricoCollectionNew = attachedCostoHistoricoCollectionNew;
            producto.setCostoHistoricoCollection(costoHistoricoCollectionNew);
            Collection<PromocioProducto> attachedPromocioProductoCollectionNew = new ArrayList<PromocioProducto>();
            for (PromocioProducto promocioProductoCollectionNewPromocioProductoToAttach : promocioProductoCollectionNew) {
                promocioProductoCollectionNewPromocioProductoToAttach = em.getReference(promocioProductoCollectionNewPromocioProductoToAttach.getClass(), promocioProductoCollectionNewPromocioProductoToAttach.getPromocioProductoPK());
                attachedPromocioProductoCollectionNew.add(promocioProductoCollectionNewPromocioProductoToAttach);
            }
            promocioProductoCollectionNew = attachedPromocioProductoCollectionNew;
            producto.setPromocioProductoCollection(promocioProductoCollectionNew);
            producto = em.merge(producto);
            if (inventarioNew != null && !inventarioNew.equals(inventarioOld)) {
                Producto oldProductoOfInventario = inventarioNew.getProducto();
                if (oldProductoOfInventario != null) {
                    oldProductoOfInventario.setInventario(null);
                    oldProductoOfInventario = em.merge(oldProductoOfInventario);
                }
                inventarioNew.setProducto(producto);
                inventarioNew = em.merge(inventarioNew);
            }
            if (garantiaidGarantiaOld != null && !garantiaidGarantiaOld.equals(garantiaidGarantiaNew)) {
                garantiaidGarantiaOld.getProductoCollection().remove(producto);
                garantiaidGarantiaOld = em.merge(garantiaidGarantiaOld);
            }
            if (garantiaidGarantiaNew != null && !garantiaidGarantiaNew.equals(garantiaidGarantiaOld)) {
                garantiaidGarantiaNew.getProductoCollection().add(producto);
                garantiaidGarantiaNew = em.merge(garantiaidGarantiaNew);
            }
            if (idCategoriaOld != null && !idCategoriaOld.equals(idCategoriaNew)) {
                idCategoriaOld.getProductoCollection().remove(producto);
                idCategoriaOld = em.merge(idCategoriaOld);
            }
            if (idCategoriaNew != null && !idCategoriaNew.equals(idCategoriaOld)) {
                idCategoriaNew.getProductoCollection().add(producto);
                idCategoriaNew = em.merge(idCategoriaNew);
            }
            for (ProductoProveedor productoProveedorCollectionNewProductoProveedor : productoProveedorCollectionNew) {
                if (!productoProveedorCollectionOld.contains(productoProveedorCollectionNewProductoProveedor)) {
                    Producto oldProductoOfProductoProveedorCollectionNewProductoProveedor = productoProveedorCollectionNewProductoProveedor.getProducto();
                    productoProveedorCollectionNewProductoProveedor.setProducto(producto);
                    productoProveedorCollectionNewProductoProveedor = em.merge(productoProveedorCollectionNewProductoProveedor);
                    if (oldProductoOfProductoProveedorCollectionNewProductoProveedor != null && !oldProductoOfProductoProveedorCollectionNewProductoProveedor.equals(producto)) {
                        oldProductoOfProductoProveedorCollectionNewProductoProveedor.getProductoProveedorCollection().remove(productoProveedorCollectionNewProductoProveedor);
                        oldProductoOfProductoProveedorCollectionNewProductoProveedor = em.merge(oldProductoOfProductoProveedorCollectionNewProductoProveedor);
                    }
                }
            }
            for (DetalleVenta detalleVentaCollectionNewDetalleVenta : detalleVentaCollectionNew) {
                if (!detalleVentaCollectionOld.contains(detalleVentaCollectionNewDetalleVenta)) {
                    Producto oldIdProductoOfDetalleVentaCollectionNewDetalleVenta = detalleVentaCollectionNewDetalleVenta.getIdProducto();
                    detalleVentaCollectionNewDetalleVenta.setIdProducto(producto);
                    detalleVentaCollectionNewDetalleVenta = em.merge(detalleVentaCollectionNewDetalleVenta);
                    if (oldIdProductoOfDetalleVentaCollectionNewDetalleVenta != null && !oldIdProductoOfDetalleVentaCollectionNewDetalleVenta.equals(producto)) {
                        oldIdProductoOfDetalleVentaCollectionNewDetalleVenta.getDetalleVentaCollection().remove(detalleVentaCollectionNewDetalleVenta);
                        oldIdProductoOfDetalleVentaCollectionNewDetalleVenta = em.merge(oldIdProductoOfDetalleVentaCollectionNewDetalleVenta);
                    }
                }
            }
            for (CostoHistorico costoHistoricoCollectionNewCostoHistorico : costoHistoricoCollectionNew) {
                if (!costoHistoricoCollectionOld.contains(costoHistoricoCollectionNewCostoHistorico)) {
                    Producto oldProductoOfCostoHistoricoCollectionNewCostoHistorico = costoHistoricoCollectionNewCostoHistorico.getProducto();
                    costoHistoricoCollectionNewCostoHistorico.setProducto(producto);
                    costoHistoricoCollectionNewCostoHistorico = em.merge(costoHistoricoCollectionNewCostoHistorico);
                    if (oldProductoOfCostoHistoricoCollectionNewCostoHistorico != null && !oldProductoOfCostoHistoricoCollectionNewCostoHistorico.equals(producto)) {
                        oldProductoOfCostoHistoricoCollectionNewCostoHistorico.getCostoHistoricoCollection().remove(costoHistoricoCollectionNewCostoHistorico);
                        oldProductoOfCostoHistoricoCollectionNewCostoHistorico = em.merge(oldProductoOfCostoHistoricoCollectionNewCostoHistorico);
                    }
                }
            }
            for (PromocioProducto promocioProductoCollectionNewPromocioProducto : promocioProductoCollectionNew) {
                if (!promocioProductoCollectionOld.contains(promocioProductoCollectionNewPromocioProducto)) {
                    Producto oldProductoOfPromocioProductoCollectionNewPromocioProducto = promocioProductoCollectionNewPromocioProducto.getProducto();
                    promocioProductoCollectionNewPromocioProducto.setProducto(producto);
                    promocioProductoCollectionNewPromocioProducto = em.merge(promocioProductoCollectionNewPromocioProducto);
                    if (oldProductoOfPromocioProductoCollectionNewPromocioProducto != null && !oldProductoOfPromocioProductoCollectionNewPromocioProducto.equals(producto)) {
                        oldProductoOfPromocioProductoCollectionNewPromocioProducto.getPromocioProductoCollection().remove(promocioProductoCollectionNewPromocioProducto);
                        oldProductoOfPromocioProductoCollectionNewPromocioProducto = em.merge(oldProductoOfPromocioProductoCollectionNewPromocioProducto);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = producto.getIdProducto();
                if (findProducto(id) == null) {
                    throw new NonexistentEntityException("The producto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Producto producto;
            try {
                producto = em.getReference(Producto.class, id);
                producto.getIdProducto();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The producto with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Inventario inventarioOrphanCheck = producto.getInventario();
            if (inventarioOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the Inventario " + inventarioOrphanCheck + " in its inventario field has a non-nullable producto field.");
            }
            Collection<ProductoProveedor> productoProveedorCollectionOrphanCheck = producto.getProductoProveedorCollection();
            for (ProductoProveedor productoProveedorCollectionOrphanCheckProductoProveedor : productoProveedorCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the ProductoProveedor " + productoProveedorCollectionOrphanCheckProductoProveedor + " in its productoProveedorCollection field has a non-nullable producto field.");
            }
            Collection<DetalleVenta> detalleVentaCollectionOrphanCheck = producto.getDetalleVentaCollection();
            for (DetalleVenta detalleVentaCollectionOrphanCheckDetalleVenta : detalleVentaCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the DetalleVenta " + detalleVentaCollectionOrphanCheckDetalleVenta + " in its detalleVentaCollection field has a non-nullable idProducto field.");
            }
            Collection<CostoHistorico> costoHistoricoCollectionOrphanCheck = producto.getCostoHistoricoCollection();
            for (CostoHistorico costoHistoricoCollectionOrphanCheckCostoHistorico : costoHistoricoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the CostoHistorico " + costoHistoricoCollectionOrphanCheckCostoHistorico + " in its costoHistoricoCollection field has a non-nullable producto field.");
            }
            Collection<PromocioProducto> promocioProductoCollectionOrphanCheck = producto.getPromocioProductoCollection();
            for (PromocioProducto promocioProductoCollectionOrphanCheckPromocioProducto : promocioProductoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Producto (" + producto + ") cannot be destroyed since the PromocioProducto " + promocioProductoCollectionOrphanCheckPromocioProducto + " in its promocioProductoCollection field has a non-nullable producto field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Garantia garantiaidGarantia = producto.getGarantiaidGarantia();
            if (garantiaidGarantia != null) {
                garantiaidGarantia.getProductoCollection().remove(producto);
                garantiaidGarantia = em.merge(garantiaidGarantia);
            }
            CategoriaProducto idCategoria = producto.getIdCategoria();
            if (idCategoria != null) {
                idCategoria.getProductoCollection().remove(producto);
                idCategoria = em.merge(idCategoria);
            }
            em.remove(producto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Producto> findProductoEntities() {
        return findProductoEntities(true, -1, -1);
    }

    public List<Producto> findProductoEntities(int maxResults, int firstResult) {
        return findProductoEntities(false, maxResults, firstResult);
    }

    private List<Producto> findProductoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Producto.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Producto findProducto(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Producto.class, id);
        } finally {
            em.close();
        }
    }

    public int getProductoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Producto> rt = cq.from(Producto.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
